home *** CD-ROM | disk | FTP | other *** search
/ Just Call Me Internet / Just Call Me Internet.iso / prog / atari / m2 / cat3src / cat / catutil.i < prev    next >
Text File  |  1997-10-26  |  12KB  |  403 lines

  1. IMPLEMENTATION MODULE CatUtil;
  2.  
  3. FROM SYSTEM IMPORT ADDRESS;
  4.  
  5. (* Magic-Module *)
  6. IMPORT mtCommand, MagicStrings, MagicXBIOS, MagicDOS, mtTextfiles, 
  7.        MagicTypes, MagicSys;
  8.  
  9. (* CAT-Module *)
  10. IMPORT CatTypes, CatFiles, CatGlobal, Messages, CatEdit, ShellCall,
  11.        ConvertDate, ConfVars, Varnames, MsgWindow, grin, msgList,
  12.        treeList, ARCStarter;
  13. FROM MTPaths            IMPORT ARCPath, MessagePath, ImportPath,
  14.                                ExportPath, DataPath, TerminalPath, ARCName,
  15.                                archiveName, TerminalName, enarcStr,
  16.                                dearcStr, TerminalCmd, ReadInf, lastInfName;
  17.  
  18. (* MM2-Module *)
  19. IMPORT Strings, StrConv, Lists, Paths;
  20.  
  21. FROM Storage IMPORT ALLOCATE, DEALLOCATE;
  22.  
  23. FROM Void IMPORT v;
  24.  
  25. CONST whatString = '@(#)CAT '+CatTypes.CatVersion + ', Copyright (c) 1997 Dirk Steins (Oct 24 1997)'+0C;
  26.  
  27. CONST cExecSelf = FALSE;
  28.  
  29. PROCEDURE makeTmpName (VAR path, name: ARRAY OF CHAR);
  30.  TYPE lBITSET = SET OF [0..31];  
  31.   VAR currentPath: CatTypes.String255;
  32.       tname     : CatTypes.String127;
  33.       mtime,
  34.       sec       : LONGCARD;
  35. BEGIN
  36.   (* Aktuellen Pfad merken *)
  37.   CatFiles.GetPath (currentPath);
  38.   (* TmpDir holen *)
  39.   IF ~mtCommand.EnvVar ('TMP', path)
  40.   THEN
  41.     (* tmpDir ist aktuelles Verzeichnis! *)
  42.     MagicStrings.Assign (currentPath, path);
  43.   END;
  44.   (* Jetzt Pfad richtig abschliežen mit Backslash *)
  45.   IF path[LENGTH(path)-1] # '\'
  46.   THEN
  47.     MagicStrings.Append ('\',path);
  48.   END;
  49.   (* Tmp-Pfad setzen *)
  50.   v.bool := CatFiles.SetPath (path);
  51.   (* Dateinamen basteln aus Inhalt des 200 Hz Timers *)
  52.   REPEAT
  53.     mtime := MagicXBIOS.Random();
  54.     MagicStrings.Assign ('CT', tname);
  55.     MagicStrings.Append (StrConv.LNumToStr (mtime, 36, 6, '0'), tname);
  56.     MagicStrings.Append ('.ASC', tname);
  57.     (* Jetzt testen, ob Datei schon vorhanden *)
  58.     MagicStrings.Assign (tname, name);
  59.     sec := CatFiles.FileSize (name, v.bool);
  60.   UNTIL ~v.bool;
  61.   (* Aktuellen Pfad wiederherstellen *)
  62.   v.bool := CatFiles.SetPath (currentPath);
  63. END makeTmpName;
  64.  
  65. PROCEDURE buildCommand (wdw: INTEGER; REF com, path, in, out: ARRAY OF CHAR; VAR cmd : ARRAY OF CHAR);
  66. (* In dieser Prozedur werden haupts„chlich Strings ersetzt 
  67.  * Das eigentliche zusammenbauen der Kommandozeile wird von einer
  68.  * Prozedur weiter oben in der Hierarchie erledigt 
  69.  * Folgendes wird ersetzt: $B fr Eingabeblock durch ersten Namen (in),
  70.  * $O fr Ausgabe des Kommandos durch zweiten Namen
  71.  *)
  72.  VAR tname  : CatTypes.String255;
  73.      p      : CARDINAL;
  74. BEGIN
  75.   MagicStrings.Assign (path, tname);
  76.   MagicStrings.Append (in, tname);
  77.   MagicStrings.Assign (com, cmd);
  78.   CatGlobal.ReplaceStr (cmd, '$B', tname);
  79.   MagicStrings.Assign (path, tname);
  80.   MagicStrings.Append (out, tname);
  81.   CatGlobal.ReplaceStr (cmd, '$O', tname);
  82.   IF Messages.MsgEditorTop (wdw)
  83.   THEN
  84.     Messages.MsgEditGetInfos (wdw, Messages.itReceiver, tname);
  85.     p := MagicStrings.Pos ('@', tname, 0, FALSE);
  86.     IF p < LENGTH (tname)
  87.     THEN
  88.       tname[p] := '';
  89.       IF tname[p-1] = ' ' THEN tname[p-1] := '' END;
  90.     END;
  91.     CatGlobal.ReplaceStr (cmd, '$U', tname);
  92.   END;
  93. END buildCommand;
  94.  
  95. (*$? cExecSelf:
  96. PROCEDURE EnvSearch (VAR val : ARRAY OF CHAR; REF name: ARRAY OF CHAR;
  97.                      env : ADDRESS);
  98.                      
  99.   PROCEDURE search (str, name : ARRAY OF CHAR;
  100.                     VAR val : ARRAY OF CHAR) : BOOLEAN;
  101.     VAR i : INTEGER;
  102.   BEGIN
  103.     Strings.Append ('=',name,v.bool);
  104.     i := Strings.Pos (name, str, 0);
  105.     IF i < 0 THEN RETURN FALSE END;
  106.     Strings.Copy (str, i+INTEGER(Strings.Length(name)),
  107.                   INTEGER(Strings.Length (str)-Strings.Length(name))-i, val, v.bool);
  108.     RETURN TRUE
  109.   END search;
  110.   
  111.   VAR ch : POINTER TO CHAR;
  112.       lastCh : CHAR;
  113.       i      : INTEGER;
  114.       str    : ARRAY [0..2047] OF CHAR;
  115. BEGIN
  116.   ch := env;
  117.   lastCh := ch^;
  118.   i := 0;
  119.   (* Solange noch env da ist *)
  120.   WHILE (ch^ # 0C) OR (lastCh # 0C) DO
  121.     str[i] := ch^;
  122.     INC(i);
  123.     lastCh := ch^;
  124.     IF lastCh = 0C
  125.     THEN (* string complete, search *)
  126.       IF search(str, name, val) THEN RETURN
  127.       ELSE
  128.         str := "";
  129.         i := 0;
  130.       END;
  131.     END;
  132.     INC (ch);
  133.   END;
  134. END EnvSearch;
  135.  
  136. PROCEDURE getSystemPaths (VAR pathList: Lists.List);
  137.   VAR basePage    : MagicTypes.PtrPD;
  138.       systemPath  : ARRAY [0..2047] OF CHAR;
  139.       p, p1, p2   : INTEGER;
  140.       path        : CatTypes.String255;
  141.       new         : CatTypes.Str255Ptr;
  142.       ok          : BOOLEAN;
  143.  
  144. BEGIN
  145.   (* suchen nach Environment-Variable PATH *)
  146.   basePage := MagicSys.Basepage();
  147.   systemPath[0] := '';
  148.   EnvSearch (systemPath, 'PATH', basePage^.pEnv);
  149.   IF systemPath[0] # ''
  150.   THEN
  151.     IF (systemPath[0] = ',')
  152.     OR (systemPath[0] = ';')
  153.     THEN
  154.       p := 1;
  155.     ELSE
  156.       p := 0;
  157.     END;
  158.     REPEAT
  159.       p1 := Strings.Pos (',', systemPath, p);
  160.       p2 := Strings.Pos (';', systemPath, p);
  161.       IF (p1 > 0) OR (p2 > 0)
  162.       THEN
  163.         IF (p1 > 0) & ((p1 < p2) OR (p2 < 0))
  164.         THEN
  165.           (* Komma als Trenner gefunden *)
  166.           Strings.Copy (systemPath, p, p1-p, path, v.bool);
  167.           p := p1+1;
  168.         ELSIF (p2 > 0) & ((p2 < p1) OR (p1 < 0))
  169.         THEN
  170.           (* Semikolon als Trenner gefunden *)
  171.           Strings.Copy (systemPath, p, p2-p, path, v.bool);
  172.           p := p2+1;
  173.         END;
  174.         (* Jetzt neuen Eintrag fr die Liste erzeugen *)
  175.         ALLOCATE (new, LENGTH (path)+2);
  176.         IF new # NIL
  177.         THEN
  178.           MagicStrings.Assign (path, new^);
  179.           (* Neuen Eintrag anlegen *)
  180.           Lists.AppendEntry (pathList, new, v.bool);
  181.         END;
  182.       ELSE 
  183.         p := -1;
  184.       END;
  185.     UNTIL p < 0;
  186.   END;
  187. END getSystemPaths;
  188.  
  189. PROCEDURE DeleteSimpleList (VAR l: Lists.List; killCarrier: BOOLEAN);
  190.  
  191. VAR   entry: ADDRESS;
  192.  
  193. BEGIN
  194.   Lists.ResetList (l);
  195.   entry := Lists.PrevEntry (l);
  196.   WHILE entry # NIL DO
  197.     Lists.RemoveEntry (l, v.bool);
  198.     DEALLOCATE (entry, 0L);
  199.     entry := Lists.CurrentEntry (l);
  200.   END;
  201.   IF killCarrier THEN Lists.DeleteList (l, v.bool) END;
  202. END DeleteSimpleList;
  203.  
  204. PROCEDURE SearchExec (VAR name: ARRAY OF CHAR): BOOLEAN;
  205.   VAR paths : Lists.List;
  206.       newName: CatTypes.String255;
  207.       found : BOOLEAN;
  208. BEGIN
  209.   Lists.CreateList (paths, v.bool);
  210.   getSystemPaths (paths);
  211.   Paths.SearchFile (name, paths, Paths.fromStart, found, newName);
  212.   (* Liste wieder l”schen *)
  213.   DeleteSimpleList (paths, TRUE);
  214.   IF found
  215.   THEN
  216.     MagicStrings.Assign (newName, name);
  217.   END;
  218.   RETURN found;
  219. END SearchExec;
  220. *)
  221.  
  222. PROCEDURE PipeEditBlock (wdw: INTEGER; REF command: ARRAY OF CHAR);
  223.   VAR path,
  224.       tname,
  225.       inName,
  226.       outName : CatTypes.String255;
  227.       len     : LONGCARD;
  228.       cmdLine : CatTypes.String255;
  229.       done    : BOOLEAN;
  230.       (*$? cExecSelf:
  231.       cmdName : CatTypes.String255;
  232.       cmdL    : CatTypes.String255;
  233.       p       : INTEGER;
  234.       res     : INTEGER;
  235.       *)
  236. BEGIN
  237.   done := FALSE;
  238.   IF LENGTH(command) = 0 THEN RETURN END;
  239.   
  240.   (* Vorgehensweise: 2*tmpFileName erstellen (in und out)
  241.    * Kommando mit Redirection an shell absetzen 
  242.    * kommando <in >out
  243.    *)
  244.   makeTmpName (path, inName);
  245.   (* Block aus Editor schreiben *)
  246.   CatEdit.EditSave (wdw, path, inName, FALSE);
  247.   (* zweiten tmpnamen basteln *)
  248.   makeTmpName (path, outName);
  249.   (* Shellkommando basteln *)
  250.   buildCommand (wdw, command, path, inName, outName, cmdLine);
  251.   (*$? cExecSelf:
  252.   (* Jetzt sehen, ob MagiX 5.04 oder gr”žer *)
  253.   IF CatGlobal.magIx & (CatGlobal.magIxVer >= $504)
  254.   THEN
  255.     (* Testen, ob mit IO-Redirection. Wenn nicht, starten wir es 
  256.      * direkt selber
  257.      *)
  258.     IF (Strings.Pos ("<", cmdLine, 0) < 0)
  259.      & (Strings.Pos (">", cmdLine, 0) < 0)
  260.      & (Strings.Pos ("|", cmdLine, 0) < 0)
  261.     THEN
  262.       (* Keine IO-Redirection, keine Pipes, also selber ausfhren *)
  263.       p := Strings.Pos (" ", cmdLine, 0);
  264.       IF p > 0
  265.       THEN
  266.         (* split command line *)
  267.         Strings.Split (cmdLine, p, cmdName, cmdL, v.bool);
  268.         Strings.DelLeadingBlanks (cmdL);
  269.         Strings.DelTrailingBlanks (cmdL);
  270.         IF SearchExec (cmdName)
  271.         THEN
  272.           ARCStarter.ExecProgram (cmdName, cmdL, FALSE, FALSE, FALSE, res);
  273.           done := res = 0;
  274.         END;
  275.       END;
  276.     END;
  277.   END;
  278.   done := TRUE;
  279.   *)
  280.   IF ~done
  281.   THEN
  282.     (* Shellkommando aufrufen *)
  283.     ShellCall.CallShell (cmdLine, TRUE);
  284.   END;
  285.   (* Testen, ob Ausgabe existiert und l„nger als 0 Bytes ist *)
  286.   MagicStrings.Assign (path, tname);
  287.   MagicStrings.Append (outName, tname);
  288.   len := CatFiles.FileSize (tname, v.bool);
  289.   IF v.bool & (len > 0) 
  290.   THEN
  291.     (* Ausgabe in Editor einlesen *)
  292.     CatEdit.EditPasteFile (wdw, TRUE, path, outName);
  293.   END;
  294.   (* tempor„re Files wieder l”schen *)
  295.   v.bool := CatFiles.DeleteFile (path, inName);
  296.   v.bool := CatFiles.DeleteFile (path, outName);
  297. END PipeEditBlock;
  298.  
  299. PROCEDURE writeInfo (REF inf: mtTextfiles.TEXTFILE);
  300.   VAR z1 : CARDINAL;
  301.       tstr   : ARRAY [0..12] OF CHAR;
  302.       dt     : ConvertDate.Date;
  303.       ti     : ConvertDate.Time;
  304. BEGIN
  305.   mtTextfiles.WriteLine (inf, '# ');
  306.   mtTextfiles.WriteLine (inf, whatString);
  307.   mtTextfiles.WriteLn (inf);
  308.   z1 := MagicDOS.Tgetdate();
  309.   dt := ConvertDate.UnpackDate (z1);
  310.   ConvertDate.DateToText (dt, 'EEE dd yyyy', tstr);
  311.   IF isTmp
  312.   THEN
  313.     mtTextfiles.WriteLine (inf, '# temporary configuration file');
  314.   ELSE
  315.     mtTextfiles.WriteLine (inf, '# configuration file');
  316.   END;
  317.   mtTextfiles.WriteLn (inf);
  318.   mtTextfiles.WriteLine (inf, '# created ');
  319.   mtTextfiles.WriteLine (inf, tstr);
  320.   mtTextfiles.WriteLine (inf, ', ');
  321.   z1 := MagicDOS.Tgettime();
  322.   ti := ConvertDate.UnpackTime (z1);
  323.   ConvertDate.TimeToText (ti, "HH:MM:SS", tstr);
  324.   mtTextfiles.WriteLine (inf, tstr);
  325.   mtTextfiles.WriteLn (inf);
  326. END writeInfo;
  327.  
  328. PROCEDURE WriteUserBlock();
  329.   CONST name = 'catuser.inf';
  330.   VAR handle : INTEGER;
  331.       infFileName : CatTypes.String255;
  332. BEGIN
  333.   MagicStrings.Assign (DataPath, infFileName);
  334.   MagicStrings.Append (name, infFileName);
  335.   isTmp := FALSE;
  336.   v.bool := ConfVars.WriteConfigFile (infFileName, writeInfo);
  337. END WriteUserBlock;
  338.  
  339. PROCEDURE GetPosPath (VAR path: ARRAY OF CHAR);
  340. BEGIN
  341.   (* Jetzt tempor„ren Pfad holen *)
  342.   ConfVars.GetConfDefBool (cUseTmpPath, v.bool, FALSE);
  343.   IF ~v.bool OR ~mtCommand.EnvVar ('TMP', path)
  344.   THEN
  345.     CatGlobal.ApplPath (path);
  346.   END;
  347.   IF LENGTH(path) = 0 
  348.   THEN 
  349.     CatGlobal.ApplPath (path);
  350.   END;
  351.   IF path[LENGTH(path)-1] # '\'
  352.   THEN
  353.     (* ggf. Backslash anh„ngen *)
  354.     MagicStrings.Append ('\', path);
  355.   END;
  356. END GetPosPath;
  357.  
  358. PROCEDURE WriteSavePos(force : BOOLEAN; delVars : BOOLEAN) : BOOLEAN;
  359.   VAR ptail : CatTypes.String255;
  360.       apPath: CatTypes.String255;
  361.       apName: BOOLEAN;
  362. BEGIN
  363.   ConfVars.GetConfDefBool (cSetAppName, apName, TRUE);
  364.   ConfVars.ConfigConfigModule (TRUE);
  365.   v.bool := ConfVars.SetConfigBool (cSetAppName, apName);
  366.   MsgWindow.msgSavePos ();
  367.   ConfVars.ConfigConfigModule (FALSE);
  368.   IF ~MsgWindow.msgCloseAll(force) 
  369.   THEN 
  370.     RETURN FALSE 
  371.   END;
  372.   ConfVars.ConfigConfigModule (TRUE);
  373.   grin.grinSavePos();
  374.   msgList.listSavePos();
  375.   CatEdit.EditSavePos();
  376.   v.bool := ConfVars.SetConfigString (cLastInfName, lastInfName);
  377.   ConfVars.ConfigConfigModule (FALSE);
  378.   IF ~CatEdit.CloseAllEditors (FALSE)
  379.   THEN 
  380.     RETURN FALSE
  381.   END;
  382.   grin.grinCloseAll();
  383.   msgList.listCloseAll();
  384.   treeList.treeCloseAll();
  385.   msgList.listFreeAll();
  386.   (* Jetzt tempor„ren Pfad holen *)
  387.   GetPosPath (ptail);
  388.   MagicStrings.Append (tmpInf, ptail);
  389.   ConfVars.ConfigConfigModule (TRUE);
  390.   isTmp := TRUE;
  391.   v.bool := ConfVars.WriteConfigFile (ptail, writeInfo);
  392.   IF delVars
  393.   THEN
  394.     (* Variablen wieder l”schen *)
  395.     ConfVars.DeleteAllVars();
  396.   END;
  397.   (* Modul wieder zurckkonfigurieren *)
  398.   ConfVars.ConfigConfigModule (FALSE);
  399.   RETURN TRUE
  400. END WriteSavePos;
  401.  
  402. END CatUtil.
  403.